/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Print;

//Impresión en Java2 mediante PrinterJob
import java.awt.*;
import java.awt.print.*;
import java.awt.geom.*;

//La clase debe de implementar la impresión implements Printable
class ObjetoAImprimir implements Printable
{
   public int print (Graphics g, PageFormat f, int pageIndex)
   {
      //Creamos un objeto 2D para dibujar en el
      Graphics2D g2 = (Graphics2D) g;
      //Este código imprime 2 páginas una con un cuadrado o marco
      //y una segunda con un circulo en la esquina superior izquierda

      //Creamos el rectángulo
      //getImagebleX() coge la parte de la hoja donde podemos 
      //imprimir quitando los bordes. Si no hiciesemos 
      //esto así y tuviesemos bordes definidos en la impresión 
      //lo que dibujasemos fuera de los bordes no lo 
      //imprimiría aunque cupiese en la hoja físicamente.
      Rectangle2D rect = new Rectangle2D.Double(f.getImageableX(),
                                                f.getImageableY(),
                                                f.getImageableWidth(),
                                                f.getImageableHeight());

      //Creamos la circunferencia
      Ellipse2D circle = new Ellipse2D.Double(100,100,100,100);

      //pageIndex indica el número de la página que se imprime
      //cuando es 0 primera página a imprimir, es un rectángulo
      //cuando es 1 segunda página a imprimir, es una circunferencia
      //En otro caso se devulve que no hay más páginas a imprimir
      switch (pageIndex)
      {
         case 0 : //Página 1: Dibujamos sobre g y luego lo pasamos a g2
                  g.setColor(Color.black);
                  g.fillRect(110,120,30,5);
                  g.setColor(Color.pink);
                  g.drawLine(0,0,200,200);
                  g2 = (Graphics2D) g;
                  return PAGE_EXISTS; //La página 1 existe y se imprimirá
         case 1 : //Página 2: Circunferencia y rectángulo
                  g2.setColor(Color.red);
                  g2.draw(circle);
                  g2.draw(rect);
                  return PAGE_EXISTS;  //La página 2 existe y se imprimirá
         default: return NO_SUCH_PAGE;        //No se imprimirán más páginas
      }
   }
}

//clase pública que se ejecuta donde debe de estar el main que llama a la
//otra clase.
public class Imprime
{
   public static void main (String[] args)
   {
      // Creamos un objeto de impresión.
      PrinterJob job = PrinterJob.getPrinterJob();

      // Hacemos imprimible el objeto ObjetoAImprimir
      job.setPrintable(new ObjetoAImprimir());
      //Pondrá algo tipo Información job: sun.awt.windows.WPrinterJob@4a5ab2
      System.out.println("Información job: " + job.toString());

      //Abre el cuadro de diálogo de la impresora, si queremos que imprima
      //directamente sin cuadro de diálogo quitamos el if...
      if (job.printDialog())
      {
        //Imprime, llama a la función print del objeto a imprimir
        //en nuestro caso el Objeto ObjetoAImprimir
         try { job.print(); }
         catch (PrinterException e) { System.out.println("Error de impresión: " + e); }
      }
   }
}
